package top.gangster.lunan.ossservice.service.imp;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.ObjectMetadata;
import java.io.ByteArrayInputStream;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import top.gangster.lunan.ossservice.service.OSSService;
import top.gangster.lunan.ossservice.utils.OSSPropertiesUtil;

@Service
public class OSSServiceImp implements OSSService{

	/**
	 * 指定fullFileName和文件，在阿里云OSS中生成指定的文件目录和文件
	 * @param file 文件
	 * @param fullFileName 文件的全路径名
	 * @return 返回访问该文件的url路径
	 */
	private String saveFileByFilePath(MultipartFile file, String fullFileName) throws Exception {
			String endPoint = OSSPropertiesUtil.END_POINT;
			String accessKeyId = OSSPropertiesUtil.ACCESS_KEY_ID;
			String accessKeySecret = OSSPropertiesUtil.ACCESS_KEY_SECRET;
			String bucketName = OSSPropertiesUtil.BUCKET_NAME;

			// 创建oss实例
			OSS oss = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);

			// 新建数据元信息
			ObjectMetadata meta = new ObjectMetadata();

			// 设置数据元信息
			meta.setContentEncoding("utf-8");

			// 设置最大上传文件大小(2M)
			if (file.getBytes().length > 2*1024*1024) {
				throw new Exception("上传文件过大");
			}

			// 依次填写Bucket名称（例如examplebucket）和Object完整路径（例如exampledir/exampleobject.txt）。Object完整路径中不能包含Bucket名称。
			oss.putObject(bucketName, fullFileName, new ByteArrayInputStream(file.getBytes()),meta);

			// 返回上传路径
			//String url = "https://edu-kid.oss-cn-beijing.aliyuncs.com/QQ%E5%9B%BE%E7%89%8720200917135220.jpg";
			return "https://" + bucketName + "." + endPoint + "/" + fullFileName;
	}

	/**
	 * 根据指定的fullFileName，在阿里云OSS中删除文件
	 * @param fullFileName 需要删除文件的完整路径，文件完整路径中不能包含Bucket名称
	 */
	private void deleteFileByFilePath(String fullFileName) throws OSSException, ClientException {
		String endPoint = OSSPropertiesUtil.END_POINT;
		String accessKeyId = OSSPropertiesUtil.ACCESS_KEY_ID;
		String accessKeySecret = OSSPropertiesUtil.ACCESS_KEY_SECRET;
		String bucketName = OSSPropertiesUtil.BUCKET_NAME;

		// 创建OSSClient实例。
		OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
		// 删除文件或目录。如果要删除目录，目录必须为空。
		ossClient.deleteObject(bucketName, fullFileName);
			// 关闭OSSClient。
		ossClient.shutdown();
	}

	/**
	 * 上传指定的合同模板，在OSS中以fileName命名
	 * @param file 合同模板文件
	 * @param fileName 保存到OSS中的文件名
	 * @return 返回访问该文件的url路径
	 */
	@Override
	public String saveTemplate(MultipartFile file, String fileName) throws Exception{

		// 获取文件的全路径
		String fullFileName = "Template/" + fileName;

		// 返回访问该文件的url路径
		return this.saveFileByFilePath(file,fullFileName);
	}

	/**
	 * 根据文件名，在阿里云OSS中删除指定文件名的合同模板文件
	 * @param fileName 模板文件名
	 * @return 是否成功删除模板
	 */
	@Override
	public void deleteTemplate(String fileName) throws OSSException,ClientException{
		String fullFileName = "Template/" + fileName;
		this.deleteFileByFilePath(fullFileName);
	}

	/**
	 * 上传指定的合同文件，在OSS中以fileName命名
	 * @param file 合同文件
	 * @param fileName 保存到OSS中的文件名
	 * @return 返回访问该文件的url路径
	 */
	@Override
	public String saveContract(MultipartFile file,String fileName) throws Exception {
		// 获取文件的全路径
		String fullFileName = "Contract/" + fileName;

		// 返回访问该文件的url路径
		return this.saveFileByFilePath(file,fullFileName);
	}

	/**
	 * 根据文件名，在阿里云OSS中删除指定的合同文件
	 *
	 * @param fileName 合同文件名
	 */
	@Override
	public void deleteContract(String fileName) throws OSSException,ClientException{
		String fullFileName = "Contract/" + fileName;
		this.deleteFileByFilePath(fullFileName);
	}
}
